{
    // 第一种写法 函数基础上分别指定类型 参数和返回值类型
    /**
     * 参数的类型 就是在形参后面加上:xxx
     * 返回值的类型 函数括号后面加上:xxx
     * @param a 
     * @param b 
     */
    function add1(a: number, b: number): number {
        return a + b
    }

    const add2 = (a: string, b: string): string => {
        return a + b
    }
    add1(1, 2)
    add2('3', '4')


    // 第二种写法 类型别名 type 类型别名 = 类型 只能用在函数表达式
    // (a: number, b: number) => number 
    // 参数a和b是数字 返回值是数字
    type MyAdd = (c: number, d: number) => number
    const add3: MyAdd = (a, b) => a + b
    add3(1, 2)

    // type MySayHi = () => void
    // 在ts中 void类型和undefined是两码事
    const sayHi = (): void => {
        console.log('hi 我是帅峰');
    }
    sayHi()

    // 如果返回值是undefined类型必须返回undefined
    const sayHi2 = (): undefined => {
        return undefined
    }
    sayHi2()

    // 可选参数的语法，就是在冒号前面加个问号
    // 类型注解 :xxx 可选参数?:xxx
    function mySlice(start?: number, end?: number) {
        console.log(start, end);
    }
    mySlice()
    mySlice(1)
    mySlice(1, 2)

    // 必选参数不能位于可选参数后面 以下写法是不行的
    // function mySlice2(start?:number, end:number) {

    // }

    // 补充 - 写了默认值就代表end是可选的
    function mySlice3 (start: number, end = 8) {
        console.log(start, end);
    }
    mySlice3(1)

}
export { }
